extern “C”
- extern “xxx”表示链接指示,用于c++调用其他语言编写的程序
还要求c++编译器有权访问其他语言的编译器(包括c语言),并且兼容
还可以链接其他语言的程序比如 extern “Ada”
- 被 extern 限定的函数或变量是 extern 类型的
- 被
extern "C"
修饰的变量和函数是按照 C 语言方式编译和链接的
extern "C"
的作用是让 C++ 编译器将 extern "C"
声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。
- 符号修饰:[extern "C" 本质论——符号和符号修饰](https://blog.csdn.net/u011025903/article/details/11804587)
extern “C” 使用
#ifdef __cplusplus
//方式1
extern "C" {
#endif
void *memset(void *, int, size_t);
#ifdef __cplusplus
}
#endif
//方式2
extern "C" size_t strlen(const char *);
- 当一个#include指示被放置在复合链接指示的花括号中,头文件中的所有普通函数声明都人未还是由链接指示的语言编写的。
extern "C" {
#include <string.h>
}
- 链接指示可以嵌套
指向extern “C”函数的指针
- 使用链接指示定义的函数来说,它的每个声明都必须使用相同的链接指示
//pf指向一个C函数,该函数接受一个int返回void
extern "C" void (*pf)(int);
- 指向C函数的指针与指向C++函数的指针是不一样的类型,不能用在初试化或赋值操作中
void (*pf1)(int); //指向c++函数
void "C" void (*pf2)(int); //指向C函数
pf1 = pf2;//error
- 链接指示对整个声明都有效
链接指示不仅对函数有效,而且对作为返回类型或形参类型的函数指针也有效
//f1是一个C函数,它的形参是一个指向C函数的指针
extern "C" void fl(void(*)(int));
- 因为链接指示同时作用于声明语句中的所有函数,如果要给C++传入C函数指针,必须使用类型别名
//FC是一个指向C函数的指针
extern "C" typedef void FC(int);
//f2是一个C++函数,该函数的形参是指向C函数的指针
void f2(FC *);
- 使用链接指示对函数进行定义,可以令C++函数在其他语言中调用
但类型受到限制,比如c语言理解不了类
extern "C" double calc(double dparm)
{
/*
...
*/
}
- 链接指示对应的语言支持重载则可能可以重载
c语言不支持重载,所以不能声明两个函数名相同的函数
extern "C" void print(const char*);
extern "C" void print(int);